Import Dataset and create working dataset:

#install.packages("plotly")
library(plotly)
package 㤼㸱plotly㤼㸲 was built under R version 4.0.4Loading required package: ggplot2
Learn more about the underlying theory at https://ggplot2-book.org/
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: 㤼㸱plotly㤼㸲

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    last_plot

The following object is masked from 㤼㸱package:stats㤼㸲:

    filter

The following object is masked from 㤼㸱package:graphics㤼㸲:

    layout
library(reshape2)
package 㤼㸱reshape2㤼㸲 was built under R version 4.0.3
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages --------------------------------------------------------------------------------------------------------------------------------------------- tidyverse 1.3.0 --
v tibble  3.0.3     v dplyr   1.0.2
v tidyr   1.1.2     v stringr 1.4.0
v readr   1.3.1     v forcats 0.5.0
v purrr   0.3.4     
-- Conflicts ------------------------------------------------------------------------------------------------------------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks plotly::filter(), stats::filter()
x dplyr::lag()    masks stats::lag()
games <- read.csv("../../data/vgsales.csv")
game_melt <- melt(data=games,id.vars = c("Rank","Name","Platform","Year","Genre","Publisher"),measure.vars=c("NA_Sales","EU_Sales","JP_Sales","Other_Sales","Global_Sales"))
game_melt$Year <- as.integer(game_melt$Year)
NAs introduced by coercion
colnames(game_melt)[7] <- "Region"
colnames(game_melt)[8] <- "Copies Sold"
head(game_melt)

Graph time baby!

#Number of Copies Sold
graph1 <- game_melt %>% 
    filter(Region == "NA_Sales") %>%
    group_by(Region,Year,Genre) %>%
    summarise("Copies Sold" = sum(`Copies Sold`)) %>% 
    ggplot() +
    aes(x=Year,
        y=`Copies Sold`,
        fill = Genre) + 
    geom_bar(stat="identity")+
    theme(axis.text.x = element_text(angle = 90, hjust=0.95, vjust=0.2)) +
    ylab("Number of Copies Sold (in millions)")
`summarise()` regrouping output by 'Region', 'Year' (override with `.groups` argument)
    
ggplotly(graph1)
Removed 12 rows containing missing values (position_stack).
#Number Releases
graph2 <- game_melt %>% 
    filter(Region == "NA_Sales") %>%
    group_by(Region,Year,Genre) %>%
    count(Genre) %>%
    rename(`Number of Releases`="n")%>% 
    ggplot() +
    aes(x=Year,
        y=`Number of Releases`,
        fill = Genre) + 
    geom_bar(stat="identity")+
    theme(axis.text.x = element_text(angle = 90, hjust=0.95, vjust=0.2))+
    ylab("Number of Games Released")
ggplotly(graph2)
Removed 12 rows containing missing values (position_stack).
is.list(y)
[1] TRUE
testfxc1 <-function(reg,plat,gen,pub,years) {
         # Input: List of Regions, Platforms, Genres, Publishers, Min and Max Year
         # Output: Graph
         #
         # Create subset based on filters 
         # Pass to graph
         # Output graph
        if ("Global_Sales" %in% reg){
            filter_region = list("Global_Sales")
        } else {
            filter_region = reg
        }
         if ("all" %in% plat){
             filter_plat = unique(game_melt$Platform)
         } else {
             filter_plat = plat
         }
         if ("all" %in% gen){
             filter_gen = unique(game_melt$Genre)
         } else {
             filter_gen = gen
         }
         if ("all" %in% pub){
             filter_pub = unique(game_melt$Publisher)
         } else {
             filter_pub = pub
         }
         min_year = years[1]
         max_year = years[2]
         
         graph1 <- game_melt[,3:8] %>% 
             subset(Region %in% filter_region & Platform %in% filter_plat & Genre %in% filter_gen & Publisher %in% filter_pub & Year >= min_year & Year <= max_year) %>%
             group_by(Year,Genre) %>%
             summarise("Copies Sold" = sum(`Copies Sold`)) %>% 
             ggplot() +
             aes(x=as.factor(Year),
                 y=`Copies Sold`,
                 fill = Genre) + 
             geom_bar(stat="identity")+
             theme(axis.text.x = element_text(angle = 90, hjust=0.95, vjust=0.2)) +
             ylab("Total Game Copies Sold (in millions)")
         
         return (ggplotly(graph1))
}

testfxc2 <-function(reg,plat,gen,pub,years) {
        # Input: List of Regions, Platforms, Genres, Publishers, Min and Max Year
        # Output: Graph
        #
        # Create subset based on filters 
        # Pass to graph
        # Output graph
        if ("Global_Sales" %in% reg){
            filter_region = list("Global_Sales")
        } else {
            filter_region = reg
        }
        if ("all" %in% plat){
            filter_plat = unique(game_melt$Platform)
        } else {
            filter_plat = plat
        }
        if ("all" %in% gen){
            filter_gen = unique(game_melt$Genre)
        } else {
            filter_gen = gen
        }
        if ("all" %in% pub){
            filter_pub = unique(game_melt$Publisher)
        } else {
            filter_pub = pub
        }
        min_year = years[1]
        max_year = years[2]
        
        graph2 <- game_melt[,3:8] %>% 
            subset(Region %in% filter_region & Platform %in% filter_plat & Genre %in% filter_gen & Publisher %in% filter_pub & Year >= min_year & Year <= max_year) %>%
            group_by(Year,Genre) %>%
            count(Year,Genre) %>%
            rename(`Number of Releases`="n") %>% 
            ggplot() +
            aes(x=as.factor(Year),
                y=`Number of Releases`,
                fill = Genre) + 
            geom_bar(stat="identity")+
            theme(axis.text.x = element_text(angle = 90, hjust=0.95, vjust=0.2))+
            ylab("Number of Games Released")

        return (ggplotly(graph2))
    }
filter_region = list("JP_Sales")
filter_plat = list("N64")
filter_gen = unique(game_melt$Genre)
filter_pub = unique(game_melt$Publisher)
min_year = 1980
max_year = 1990
test <- game_melt %>% 
    subset(Region %in% filter_region & Platform %in% filter_plat & Genre %in% filter_gen & Publisher %in% filter_pub & Year >= min_year & Year <= max_year)
dim(test)
[1] 0 8
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KSW1wb3J0IERhdGFzZXQgYW5kIGNyZWF0ZSB3b3JraW5nIGRhdGFzZXQ6DQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpnYW1lcyA8LSByZWFkLmNzdigiLi4vLi4vZGF0YS92Z3NhbGVzLmNzdiIpDQpnYW1lX21lbHQgPC0gbWVsdChkYXRhPWdhbWVzLGlkLnZhcnMgPSBjKCJSYW5rIiwiTmFtZSIsIlBsYXRmb3JtIiwiWWVhciIsIkdlbnJlIiwiUHVibGlzaGVyIiksbWVhc3VyZS52YXJzPWMoIk5BX1NhbGVzIiwiRVVfU2FsZXMiLCJKUF9TYWxlcyIsIk90aGVyX1NhbGVzIiwiR2xvYmFsX1NhbGVzIikpDQpnYW1lX21lbHQkWWVhciA8LSBhcy5pbnRlZ2VyKGdhbWVfbWVsdCRZZWFyKQ0KY29sbmFtZXMoZ2FtZV9tZWx0KVs3XSA8LSAiUmVnaW9uIg0KY29sbmFtZXMoZ2FtZV9tZWx0KVs4XSA8LSAiQ29waWVzIFNvbGQiDQpoZWFkKGdhbWVfbWVsdCkNCmBgYA0KR3JhcGggdGltZSBiYWJ5IQ0KYGBge3J9DQojTnVtYmVyIG9mIENvcGllcyBTb2xkDQpncmFwaDEgPC0gZ2FtZV9tZWx0ICU+JSANCiAgICBmaWx0ZXIoUmVnaW9uID09ICJOQV9TYWxlcyIpICU+JQ0KICAgIGdyb3VwX2J5KFJlZ2lvbixZZWFyLEdlbnJlKSAlPiUNCiAgICBzdW1tYXJpc2UoIkNvcGllcyBTb2xkIiA9IHN1bShgQ29waWVzIFNvbGRgKSkgJT4lIA0KICAgIGdncGxvdCgpICsNCiAgICBhZXMoeD1ZZWFyLA0KICAgICAgICB5PWBDb3BpZXMgU29sZGAsDQogICAgICAgIGZpbGwgPSBHZW5yZSkgKyANCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0PTAuOTUsIHZqdXN0PTAuMikpICsNCiAgICB5bGFiKCJOdW1iZXIgb2YgQ29waWVzIFNvbGQgKGluIG1pbGxpb25zKSIpDQogICAgDQpnZ3Bsb3RseShncmFwaDEpDQpgYGANCg0KYGBge3J9DQojTnVtYmVyIFJlbGVhc2VzDQpncmFwaDIgPC0gZ2FtZV9tZWx0ICU+JSANCiAgICBmaWx0ZXIoUmVnaW9uID09ICJOQV9TYWxlcyIpICU+JQ0KICAgIGdyb3VwX2J5KFJlZ2lvbixZZWFyLEdlbnJlKSAlPiUNCiAgICBjb3VudChHZW5yZSkgJT4lDQogICAgcmVuYW1lKGBOdW1iZXIgb2YgUmVsZWFzZXNgPSJuIiklPiUgDQogICAgZ2dwbG90KCkgKw0KICAgIGFlcyh4PVllYXIsDQogICAgICAgIHk9YE51bWJlciBvZiBSZWxlYXNlc2AsDQogICAgICAgIGZpbGwgPSBHZW5yZSkgKyANCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0PTAuOTUsIHZqdXN0PTAuMikpKw0KICAgIHlsYWIoIk51bWJlciBvZiBHYW1lcyBSZWxlYXNlZCIpDQpnZ3Bsb3RseShncmFwaDIpDQpgYGANCmBgYHtyfQ0KI051bWJlciBvZiBQbGF0Zm9ybXMsIEdlbnJlcyBhbmQgUHVibGlzaGVycyB3aXRoIGdhbWVzID4gMTAwIGNvcGllcyBzb2xkIA0KZ3JhcGgzIDwtIGdhbWVfbWVsdCAlPiUgDQogICAgZmlsdGVyKFJlZ2lvbiA9PSAiSlBfU2FsZXMiKSAlPiUNCiAgICBncm91cF9ieShZZWFyKSU+JQ0KICAgIG1lbHQoaWQudmFycz1jKCJZZWFyIiksbWVhc3VyZS52YXJzPWMoIkdlbnJlIiwiUGxhdGZvcm0iLCJQdWJsaXNoZXIiKSkgJT4lDQogICAgcmVuYW1lKENhdGVnb3J5PSd2YXJpYWJsZScpICU+JSANCiAgICBncm91cF9ieShZZWFyLENhdGVnb3J5KSAlPiUNCiAgICB1bmlxdWUoKSAlPiUNCiAgICBjb3VudChZZWFyLENhdGVnb3J5KSAlPiUNCiAgICByZW5hbWUoYENvdW50cyBvZiBHZW5yZXMsIFB1Ymxpc2hlcnMgYW5kIFBsYXRmb3Jtc2A9IG4pICU+JSANCiAgICBnZ3Bsb3QoKSArDQogICAgYWVzKHg9WWVhciwNCiAgICAgICAgeT1gQ291bnRzIG9mIEdlbnJlcywgUHVibGlzaGVycyBhbmQgUGxhdGZvcm1zYCwNCiAgICAgICAgZmlsbCA9IENhdGVnb3J5KSArIA0KICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3Q9MC45NSwgdmp1c3Q9MC4yKSkrDQogICAgeWxhYigiQ291bnRzIG9mIEdlbnJlcywgUHVibGlzaGVycyBhbmQgUGxhdGZvcm1zIikNCmdncGxvdGx5KGdyYXBoMykNCng8LTENCnk8LWxpc3QoeCkNCmlzLmxpc3QoeSkNCmBgYA0KDQpgYGB7cn0NCnRlc3RmeGMxIDwtZnVuY3Rpb24ocmVnLHBsYXQsZ2VuLHB1Yix5ZWFycykgew0KICAgICAgICAgIyBJbnB1dDogTGlzdCBvZiBSZWdpb25zLCBQbGF0Zm9ybXMsIEdlbnJlcywgUHVibGlzaGVycywgTWluIGFuZCBNYXggWWVhcg0KICAgICAgICAgIyBPdXRwdXQ6IEdyYXBoDQogICAgICAgICAjDQogICAgICAgICAjIENyZWF0ZSBzdWJzZXQgYmFzZWQgb24gZmlsdGVycyANCiAgICAgICAgICMgUGFzcyB0byBncmFwaA0KICAgICAgICAgIyBPdXRwdXQgZ3JhcGgNCiAgICAgICAgaWYgKCJHbG9iYWxfU2FsZXMiICVpbiUgcmVnKXsNCiAgICAgICAgICAgIGZpbHRlcl9yZWdpb24gPSBsaXN0KCJHbG9iYWxfU2FsZXMiKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZmlsdGVyX3JlZ2lvbiA9IHJlZw0KICAgICAgICB9DQogICAgICAgICBpZiAoImFsbCIgJWluJSBwbGF0KXsNCiAgICAgICAgICAgICBmaWx0ZXJfcGxhdCA9IHVuaXF1ZShnYW1lX21lbHQkUGxhdGZvcm0pDQogICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgIGZpbHRlcl9wbGF0ID0gcGxhdA0KICAgICAgICAgfQ0KICAgICAgICAgaWYgKCJhbGwiICVpbiUgZ2VuKXsNCiAgICAgICAgICAgICBmaWx0ZXJfZ2VuID0gdW5pcXVlKGdhbWVfbWVsdCRHZW5yZSkNCiAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgZmlsdGVyX2dlbiA9IGdlbg0KICAgICAgICAgfQ0KICAgICAgICAgaWYgKCJhbGwiICVpbiUgcHViKXsNCiAgICAgICAgICAgICBmaWx0ZXJfcHViID0gdW5pcXVlKGdhbWVfbWVsdCRQdWJsaXNoZXIpDQogICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgIGZpbHRlcl9wdWIgPSBwdWINCiAgICAgICAgIH0NCiAgICAgICAgIG1pbl95ZWFyID0geWVhcnNbMV0NCiAgICAgICAgIG1heF95ZWFyID0geWVhcnNbMl0NCiAgICAgICAgIA0KICAgICAgICAgZ3JhcGgxIDwtIGdhbWVfbWVsdFssMzo4XSAlPiUgDQogICAgICAgICAgICAgc3Vic2V0KFJlZ2lvbiAlaW4lIGZpbHRlcl9yZWdpb24gJiBQbGF0Zm9ybSAlaW4lIGZpbHRlcl9wbGF0ICYgR2VucmUgJWluJSBmaWx0ZXJfZ2VuICYgUHVibGlzaGVyICVpbiUgZmlsdGVyX3B1YiAmIFllYXIgPj0gbWluX3llYXIgJiBZZWFyIDw9IG1heF95ZWFyKSAlPiUNCiAgICAgICAgICAgICBncm91cF9ieShZZWFyLEdlbnJlKSAlPiUNCiAgICAgICAgICAgICBzdW1tYXJpc2UoIkNvcGllcyBTb2xkIiA9IHN1bShgQ29waWVzIFNvbGRgKSkgJT4lIA0KICAgICAgICAgICAgIGdncGxvdCgpICsNCiAgICAgICAgICAgICBhZXMoeD1hcy5mYWN0b3IoWWVhciksDQogICAgICAgICAgICAgICAgIHk9YENvcGllcyBTb2xkYCwNCiAgICAgICAgICAgICAgICAgZmlsbCA9IEdlbnJlKSArIA0KICAgICAgICAgICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrDQogICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3Q9MC45NSwgdmp1c3Q9MC4yKSkgKw0KICAgICAgICAgICAgIHlsYWIoIlRvdGFsIEdhbWUgQ29waWVzIFNvbGQgKGluIG1pbGxpb25zKSIpDQogICAgICAgICANCiAgICAgICAgIHJldHVybiAoZ2dwbG90bHkoZ3JhcGgxKSkNCn0NCg0KdGVzdGZ4YzIgPC1mdW5jdGlvbihyZWcscGxhdCxnZW4scHViLHllYXJzKSB7DQogICAgICAgICMgSW5wdXQ6IExpc3Qgb2YgUmVnaW9ucywgUGxhdGZvcm1zLCBHZW5yZXMsIFB1Ymxpc2hlcnMsIE1pbiBhbmQgTWF4IFllYXINCiAgICAgICAgIyBPdXRwdXQ6IEdyYXBoDQogICAgICAgICMNCiAgICAgICAgIyBDcmVhdGUgc3Vic2V0IGJhc2VkIG9uIGZpbHRlcnMgDQogICAgICAgICMgUGFzcyB0byBncmFwaA0KICAgICAgICAjIE91dHB1dCBncmFwaA0KICAgICAgICBpZiAoIkdsb2JhbF9TYWxlcyIgJWluJSByZWcpew0KICAgICAgICAgICAgZmlsdGVyX3JlZ2lvbiA9IGxpc3QoIkdsb2JhbF9TYWxlcyIpDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmaWx0ZXJfcmVnaW9uID0gcmVnDQogICAgICAgIH0NCiAgICAgICAgaWYgKCJhbGwiICVpbiUgcGxhdCl7DQogICAgICAgICAgICBmaWx0ZXJfcGxhdCA9IHVuaXF1ZShnYW1lX21lbHQkUGxhdGZvcm0pDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmaWx0ZXJfcGxhdCA9IHBsYXQNCiAgICAgICAgfQ0KICAgICAgICBpZiAoImFsbCIgJWluJSBnZW4pew0KICAgICAgICAgICAgZmlsdGVyX2dlbiA9IHVuaXF1ZShnYW1lX21lbHQkR2VucmUpDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmaWx0ZXJfZ2VuID0gZ2VuDQogICAgICAgIH0NCiAgICAgICAgaWYgKCJhbGwiICVpbiUgcHViKXsNCiAgICAgICAgICAgIGZpbHRlcl9wdWIgPSB1bmlxdWUoZ2FtZV9tZWx0JFB1Ymxpc2hlcikNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZpbHRlcl9wdWIgPSBwdWINCiAgICAgICAgfQ0KICAgICAgICBtaW5feWVhciA9IHllYXJzWzFdDQogICAgICAgIG1heF95ZWFyID0geWVhcnNbMl0NCiAgICAgICAgDQogICAgICAgIGdyYXBoMiA8LSBnYW1lX21lbHRbLDM6OF0gJT4lIA0KICAgICAgICAgICAgc3Vic2V0KFJlZ2lvbiAlaW4lIGZpbHRlcl9yZWdpb24gJiBQbGF0Zm9ybSAlaW4lIGZpbHRlcl9wbGF0ICYgR2VucmUgJWluJSBmaWx0ZXJfZ2VuICYgUHVibGlzaGVyICVpbiUgZmlsdGVyX3B1YiAmIFllYXIgPj0gbWluX3llYXIgJiBZZWFyIDw9IG1heF95ZWFyKSAlPiUNCiAgICAgICAgICAgIGdyb3VwX2J5KFllYXIsR2VucmUpICU+JQ0KICAgICAgICAgICAgY291bnQoWWVhcixHZW5yZSkgJT4lDQogICAgICAgICAgICByZW5hbWUoYE51bWJlciBvZiBSZWxlYXNlc2A9Im4iKSAlPiUgDQogICAgICAgICAgICBnZ3Bsb3QoKSArDQogICAgICAgICAgICBhZXMoeD1hcy5mYWN0b3IoWWVhciksDQogICAgICAgICAgICAgICAgeT1gTnVtYmVyIG9mIFJlbGVhc2VzYCwNCiAgICAgICAgICAgICAgICBmaWxsID0gR2VucmUpICsgDQogICAgICAgICAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKw0KICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3Q9MC45NSwgdmp1c3Q9MC4yKSkrDQogICAgICAgICAgICB5bGFiKCJOdW1iZXIgb2YgR2FtZXMgUmVsZWFzZWQiKQ0KDQogICAgICAgIHJldHVybiAoZ2dwbG90bHkoZ3JhcGgyKSkNCiAgICB9DQpgYGANCg0KYGBge3J9DQpmaWx0ZXJfcmVnaW9uID0gbGlzdCgiSlBfU2FsZXMiKQ0KZmlsdGVyX3BsYXQgPSBsaXN0KCJONjQiKQ0KZmlsdGVyX2dlbiA9IHVuaXF1ZShnYW1lX21lbHQkR2VucmUpDQpmaWx0ZXJfcHViID0gdW5pcXVlKGdhbWVfbWVsdCRQdWJsaXNoZXIpDQptaW5feWVhciA9IDE5ODANCm1heF95ZWFyID0gMTk5MA0KdGVzdCA8LSBnYW1lX21lbHQgJT4lIA0KICAgIHN1YnNldChSZWdpb24gJWluJSBmaWx0ZXJfcmVnaW9uICYgUGxhdGZvcm0gJWluJSBmaWx0ZXJfcGxhdCAmIEdlbnJlICVpbiUgZmlsdGVyX2dlbiAmIFB1Ymxpc2hlciAlaW4lIGZpbHRlcl9wdWIgJiBZZWFyID49IG1pbl95ZWFyICYgWWVhciA8PSBtYXhfeWVhcikNCmRpbSh0ZXN0KQ0KYGBgDQpgYGB7cn0NCnggPC0gZ2FtZV9tZWx0ICU+JSAjSW5pdGlhbGl6ZSBUb3AgR2VucmUgQ2FyZCAoVGFiMykNCiAgICBncm91cF9ieShHZW5yZSkgJT4lDQogICAgc3VtbWFyaXNlKCJDb3BpZXMgU29sZCIgPSBzdW0oYENvcGllcyBTb2xkYCkpICU+JQ0KICAgIHN1YnNldChgQ29waWVzIFNvbGRgPT0gbWF4KGBDb3BpZXMgU29sZGApKQ0KeFsxXQ0KYGBgDQoNCg0KDQoNCg==